package com.example.design.patterns.geekbang.创建型.工厂模式.原理解析;

import com.example.design.patterns.geekbang.创建型.工厂模式.原理解析.dependent.IRuleConfigParser;
import com.example.design.patterns.geekbang.创建型.工厂模式.原理解析.dependent.InvalidRuleConfigException;
import com.example.design.patterns.geekbang.创建型.工厂模式.原理解析.dependent.RuleConfig;
import com.example.design.patterns.geekbang.创建型.工厂模式.原理解析.factory.IRuleConfigParserFactory;

/**
 * 工厂模式使用规则:
 *  第一种情况：类似规则配置解析的例子，代码中存在 if-else 分支判断，动态地根据不同的类型创建不同的对象。
 *  针对这种情况，我们就考虑使用工厂模式，将这一大坨 if-else 创建对象的代码抽离出来，放到工厂类中。
 *
 *  第二种情况，尽管我们不需要根据不同的类型创建不同的对象，但是，单个对象本身的创建过程比较复杂，
 *  比如前面提到的要组合其他类对象，做各种初始化操作。在这种情况下，我们也可以考虑使用工厂模式，
 *  将对象的创建过程封装到工厂类中。
 */
public class RuleConfigSource {
    public RuleConfig load(String ruleConfigFilePath) throws InvalidRuleConfigException {
        String ruleConfigFileExtension = getFileExtension(ruleConfigFilePath);
        //IRuleConfigParser parser = RuleConfigParserFactory.createParser(ruleConfigFileExtension);
        IRuleConfigParserFactory parserFactory = RuleConfigParserFactoryMap.getParserFactory(ruleConfigFileExtension);
        if (parserFactory == null) {
            throw new InvalidRuleConfigException("Rule config file format is not supported: " + ruleConfigFilePath);

        }
        String configText = "";
        IRuleConfigParser parser = parserFactory.createParser();
        //从ruleConfigFilePath文件中读取配置文本到configText中
        RuleConfig ruleConfig = parser.parse(configText);
        return ruleConfig;
    }

    private String getFileExtension(String filePath) {
        //...解析文件名获取扩展名，比如rule.json，返回json
        return "json";
    }
}
